﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using F1010DB.CustomEntity.ScoutMemberCustom;
using F1010DB.Constant;
using F1010DB.Enums;
using System.Data;
namespace F1010DB.ScoutMember
{
    public abstract class AbstractScoutMember : AbstractGetBridgeConnect
    {
        
        //----Các biến dùng để nhập liệu
        private ScoutMemberInput scoutMemberInput;
        private Dictionary<string, object> parameters;
        private List<String> columnForAddNew = null;
        private Dictionary<string, object> paramerter2ForHist;
        private List<String> columnForHis = null;

        //-- khu vực dùng để set giá trị ở lớp con Services
        protected abstract ScoutMemberInput setScoutMemberInput();
        protected abstract List<string> inputErrorValidation(ScoutMemberInput inputForm);
              
        // Chuẩn bị insert 
        private void prepareForInsert()
        {
            scoutMemberInput = setScoutMemberInput();
        }

        /// <summary>
        /// Dữ liệu vào bảng DOAN_SINH_MASTER_HISTORY
        /// </summary>
        private void intializeForHistoryAdd()
        {
            paramerter2ForHist = new Dictionary<string, object>();

            paramerter2ForHist.Add("@MA_DON_VI", scoutMemberInput.MaDonViBanDau);
            paramerter2ForHist.Add("@MA_DOAN_SINH", scoutMemberInput.MaDoanSinh);
            paramerter2ForHist.Add("@MA_DOI", scoutMemberInput.teamId);
            paramerter2ForHist.Add("@NGAY_NHAP_DON_VI", DateTime.Now.Date);
            paramerter2ForHist.Add("@NGAY_VAO_SO_DON_VI", DateTime.Now.Date);
            paramerter2ForHist.Add("@TRACH_VU", 101);
            paramerter2ForHist.Add("@INS_USER", scoutMemberInput.MaDonViBanDau);
            paramerter2ForHist.Add("@INS_DATE", DateTime.Now.Date);

            columnForHis = new List<string>();
            columnForHis.Add("MA_DON_VI");
            columnForHis.Add("MA_DOAN_SINH");
            columnForHis.Add("MA_DOI");
            columnForHis.Add("NGAY_NHAP_DON_VI");
            columnForHis.Add("NGAY_VAO_SO_DON_VI");
            columnForHis.Add("TRACH_VU");
            columnForHis.Add("INS_USER");
            columnForHis.Add("INS_DATE");
        }
        
        /// <summary>
        /// Dữ liệu vào bẳng DOAN_SINH_MASTER
        /// </summary>
        private void intializeForParameters()
        {
            DateTime dtNgaySinh = new DateTime(1900,1,1);
            if (!String.IsNullOrEmpty(scoutMemberInput.namSinh) && !String.IsNullOrEmpty(scoutMemberInput.thangSinh) && !String.IsNullOrEmpty(scoutMemberInput.ngaySinh))
            {
                dtNgaySinh = new DateTime(Int16.Parse(scoutMemberInput.namSinh), Int16.Parse(scoutMemberInput.thangSinh), Int16.Parse(scoutMemberInput.ngaySinh));
            }

            parameters = new Dictionary<string, object>();

            parameters.Add("@ID",scoutMemberInput.Id);
            parameters.Add("@MA_DOAN_SINH", scoutMemberInput.MaDoanSinh);
            parameters.Add("@MA_DON_VI_BAN_DAU", scoutMemberInput.MaDonViBanDau);
            parameters.Add("@HO_LOT", scoutMemberInput.HoLot);
            parameters.Add("@TEN_DEM",scoutMemberInput.TenDem);
            parameters.Add("@TEN",scoutMemberInput.Ten);
            parameters.Add("@GIOI_TINH",scoutMemberInput.GioiTinh);
            parameters.Add("@NGAY_SINH",dtNgaySinh);
            parameters.Add("@NOI_SINH",scoutMemberInput.NoiSinh);
            parameters.Add("@DAN_TOC",scoutMemberInput.DanToc);
            parameters.Add("@TON_GIAO",scoutMemberInput.TonGiao);
            parameters.Add("@SO_NHA",scoutMemberInput.SoNha);
            parameters.Add("@DUONG",scoutMemberInput.Duong);
            parameters.Add("@PHUONG",scoutMemberInput.Phuong);
            parameters.Add("@QUAN",scoutMemberInput.Quan);
            parameters.Add("@TINH",scoutMemberInput.Tinh);
            parameters.Add("@SO_DIEN_THOAI_NHA",scoutMemberInput.SoDienThoaiNha);
            parameters.Add("@SO_DIEN_THOAI_DD",scoutMemberInput.SoDienThoaiDd);
            parameters.Add("@EMAIL",scoutMemberInput.Email);
            parameters.Add("@FACEBOOK",scoutMemberInput.Facebook);
            parameters.Add("@YAHOO",scoutMemberInput.Yahoo);
            parameters.Add("@TWITTER",scoutMemberInput.Twitter);

            // Nếu số chứng minh nhân dân được nhập vào
            if (scoutMemberInput.Socmnd != String.Empty)
            {
                parameters.Add("@SOCMND", scoutMemberInput.Socmnd);
                parameters.Add("@NGAYCAP", scoutMemberInput.Ngaycap);
                parameters.Add("@NOICAP", scoutMemberInput.Noicap);
            }
            parameters.Add("@NGHE_NGHIEP",scoutMemberInput.NgheNghiep);
            parameters.Add("@NOI_LAM_VIEC",scoutMemberInput.NoiLamViec);
            parameters.Add("@LOP",scoutMemberInput.Lop);
            parameters.Add("@TINH_TRANG", (int) EnumForScout.StatusForScout.ACTIVE);
            parameters.Add("@NGAY_THAM_GIA_PT",scoutMemberInput.NgayThamGiaPt);

            if (scoutMemberInput.isTuyenHua)
            {
                parameters.Add("@NGAY_TUYEN_HUA", scoutMemberInput.NgayTuyenHua);
                parameters.Add("@DON_VI_TUYEN_HUA", scoutMemberInput.DonViTuyenHua);
                parameters.Add("@TRUONG_NHAN_TH", scoutMemberInput.TruongNhanTh);
            }

            parameters.Add("@HO_VA_TEN_BA",scoutMemberInput.HoVaTenBa);
            parameters.Add("@SO_DT_BA",scoutMemberInput.SoDtBa);
            parameters.Add("@HO_VA_TEN_ME",scoutMemberInput.HoVaTenMe);
            parameters.Add("@SO_DT_ME",scoutMemberInput.SoDtMe);
            parameters.Add("@HO_VA_TEN_GIAM_HO",scoutMemberInput.HoVaTenGiamHo);
            parameters.Add("@SO_DT_GIAM_HO",scoutMemberInput.SoDtGiamHo);
            parameters.Add("@QUAN_HE_GIAM_HO",scoutMemberInput.QuanHeGiamHo);
            parameters.Add("@INS_USER",scoutMemberInput.InsUser);
            parameters.Add("@INS_DATE", scoutMemberInput.InsDate);
            parameters.Add("@DEL_F",false);
            parameters.Add("@EMAIL_BA", scoutMemberInput.emailBa);
            parameters.Add("@EMAIL_ME", scoutMemberInput.emailMe);
            parameters.Add("@DA_TUYEN_HUA", scoutMemberInput.isTuyenHua);
            parameters.Add("@TRINH_DO_HOC_VAN", scoutMemberInput.TrinhDoHocVan);


            // tạo các cột dữ liệu sẽ thêm vào
            columnForAddNew = new List<string>();
            columnForAddNew.Add("ID");
            columnForAddNew.Add("MA_DOAN_SINH");
            columnForAddNew.Add("MA_DON_VI_BAN_DAU");
            columnForAddNew.Add("HO_LOT");
            columnForAddNew.Add("TEN_DEM");
            columnForAddNew.Add("TEN");
            columnForAddNew.Add("GIOI_TINH");
            columnForAddNew.Add("NGAY_SINH");
            columnForAddNew.Add("NOI_SINH");
            columnForAddNew.Add("DAN_TOC");
            columnForAddNew.Add("TON_GIAO");
            columnForAddNew.Add("SO_NHA");
            columnForAddNew.Add("DUONG");
            columnForAddNew.Add("PHUONG");
            columnForAddNew.Add("QUAN");
            columnForAddNew.Add("TINH");
            columnForAddNew.Add("SO_DIEN_THOAI_NHA");
            columnForAddNew.Add("SO_DIEN_THOAI_DD");
            columnForAddNew.Add("EMAIL");
            columnForAddNew.Add("FACEBOOK");
            columnForAddNew.Add("YAHOO");
            columnForAddNew.Add("TWITTER");

            if (scoutMemberInput.Socmnd != String.Empty)
            {
                columnForAddNew.Add("SOCMND");
                columnForAddNew.Add("NGAYCAP");
                columnForAddNew.Add("NOICAP");
            }

            columnForAddNew.Add("NGHE_NGHIEP");
            columnForAddNew.Add("NOI_LAM_VIEC");
            columnForAddNew.Add("LOP");
            columnForAddNew.Add("TINH_TRANG");
            columnForAddNew.Add("NGAY_THAM_GIA_PT");

            if (scoutMemberInput.isTuyenHua)
            {
                columnForAddNew.Add("NGAY_TUYEN_HUA");
                columnForAddNew.Add("DON_VI_TUYEN_HUA");
                columnForAddNew.Add("TRUONG_NHAN_TH");
            }

            columnForAddNew.Add("HO_VA_TEN_BA");
            columnForAddNew.Add("SO_DT_BA");
            columnForAddNew.Add("HO_VA_TEN_ME");
            columnForAddNew.Add("SO_DT_ME");
            columnForAddNew.Add("HO_VA_TEN_GIAM_HO");
            columnForAddNew.Add("SO_DT_GIAM_HO");
            columnForAddNew.Add("QUAN_HE_GIAM_HO");
            columnForAddNew.Add("INS_USER");
            columnForAddNew.Add("INS_DATE");
            columnForAddNew.Add("DEL_F");
            columnForAddNew.Add("EMAIL_BA");
            columnForAddNew.Add("EMAIL_ME");
            columnForAddNew.Add("DA_TUYEN_HUA");
            columnForAddNew.Add("TRINH_DO");
        }

        private List<string> hasInputError()
        {
            return inputErrorValidation(scoutMemberInput);
        }

        public ResultAction insertDatabaseNewScoutMember()
        {
            prepareForInsert();
            List<string> err = hasInputError();
            ResultAction result = new ResultAction();
            if (err.Count != 0)
            {
                result.isSucceed = false;
                result.sMsg = err;
            }
            else
            {
                intializeForParameters();
                intializeForHistoryAdd();

                // Tự động tạo câu lệnh SQL
                string[] arrColumn = columnForAddNew.ToArray();
                string[] parameterList = parameters.Keys.ToArray();

                // Tự động câu lệnh SQL thứ hai
                string[] arrCoHis = columnForHis.ToArray();
                string[] arrParHis = paramerter2ForHist.Keys.ToArray();
                // Câu lệnh SQL dùng cho DOAN_SINH_MASTER
                SqlBuilderBasical basical = new SqlBuilderBasical(arrColumn, TableNameList.TABLE_DOAN_SINH_MASTER, parameterList);
                string sql = basical.setInsertSQLStatement();
                // Câu lệnh SQL dùng cho DOAN_SINH_MASTER_HISTORY
                SqlBuilderBasical basicalHistory = new SqlBuilderBasical(arrCoHis, TableNameList.TABLE_DOAN_SINH_MASTER_HISTORY, arrParHis);
                string sql1 = basicalHistory.setInsertSQLStatement();
                SetSQLEntityCommand commandForDOANSINHMASTER = new SetSQLEntityCommand();

                commandForDOANSINHMASTER.sql = sql;
                commandForDOANSINHMASTER.type = System.Data.CommandType.Text;
                commandForDOANSINHMASTER.dicPara = parameters;

                SetSQLEntityCommand commandForDOANSINHMASTERHISTORY = new SetSQLEntityCommand();

                commandForDOANSINHMASTERHISTORY.sql = sql1;
                commandForDOANSINHMASTERHISTORY.type = System.Data.CommandType.Text;
                commandForDOANSINHMASTERHISTORY.dicPara = paramerter2ForHist;

                bool inserted = dbContext.executeNonQuery(commandForDOANSINHMASTER.sql, commandForDOANSINHMASTER.type, commandForDOANSINHMASTER.dicPara);
                bool insertedHDVN = dbContext.executeNonQuery(commandForDOANSINHMASTERHISTORY.sql, commandForDOANSINHMASTERHISTORY.type, commandForDOANSINHMASTERHISTORY.dicPara);
                List<string> s = new List<string>();

                if (inserted && insertedHDVN)
                {
                    result.isSucceed = true;
                    s.Add("Thêm đoàn sinh này thành công !");
                }
                else
                {
                    result.isSucceed = false;
                    s.Add("Không thêm thành công kiểm tra lại !");

                }
                result.sMsg = s;
            }

            return result;
        }

        // Search thông tin danh sách đoàn sinh
        protected DataTable GetAllDanhSachDoanSinh(string[] arrayColumn, EnumForScout.ListCate cate, string maDonVi, object[] arg1)
        {
            string sqlVWDanh = "SELECT ";
            StringBuilder sb = new StringBuilder();
            for (int i=0; i< arrayColumn.Length; i++)
            {
                sb.Append(arrayColumn[i] + " ");

                if (i != arrayColumn.Length - 1)
                {
                    sb.Append(" ,");
                }
            } 

            sqlVWDanh = sqlVWDanh + sb.ToString() + " FROM HDVNQTRI.VW_DANH_SACH_DOAN_SINH_DON_VI WHERE MA_DON_VI = @madonvi";

            Dictionary<string, object> sr = new Dictionary<string, object>();

            sr.Add("@madonvi", maDonVi);
            switch (cate)
            {

                case EnumForScout.ListCate.OVER_AGE_LIST:
                    sqlVWDanh = sqlVWDanh + " AND YEAR(GETDATE()) - YEAR(NGAY_SINH) > @maxAge ";
                    sr.Add("@maxAge", arg1[0]);
                    break;
                case EnumForScout.ListCate.RELEASE_LIST:
                    sqlVWDanh = sqlVWDanh + " AND ACTIVE = '0' ";
                    break;
            }
            return dbContext.readATable(sqlVWDanh, CommandType.Text, sr);
        }
    }
}
